package fr.afcepf.atod19.patisserie.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import fr.afcepf.atod19.patisserie.entity.Patisserie;
import fr.afcepf.atod19.patisserie.util.UtilConnexionJDBC;

/**
 * {@link Patisserie}.
 * @author Stagiaire
 *
 */
public class DataPatisserieImpl implements IDataPatisserie {
    /**
     * Position du parametre Nom dans la requete d'ajout.
     */
    private final int indiceParamNomAjout = 1;
    /**
     * Position du parametre Description dans la requete d'ajout.
     */
    private final int indiceParamDescriptionAjout = 2;
    /**
     * Position du parametre Prix dans la requete d'ajout.
     */
    private final int indiceParamPrixAjout = 3;
    /**
     * Position du parametre Calorie dans la requete d'ajout.
     */
    private final int indiceParamCalorieAjout = 4;
    /**
     * Position du parametre Nom dans la requete de recherche.
     */
    private final int indiceParamNomRecherche = 1;
    /**
     * Position du parametre Id dans la requete de suppression.
     */
    private final int indiceParamIdManger = 1;
    /**
     * Position de la column Id dans la requete de recherche.
     */
    private final int indiceColumnId = 1;
    /**
     *  Position de la column Nom dans la requete de recherche.
     */
    private final int indiceColumnNom = 2;
    /**
     *  Position de la column Description dans la requete de recherche.
     */
    private final int indiceColumnDescription = 3;
    /**
     *  Position de la column Prix dans la requete de recherche.
     */
    private final int indiceColumnPrix = 4;
    /**
     *  Position de la column Calorie dans la requete de recherche.
     */
    private final int indiceColumnCalorie = 5;
    /**
     *  Position de la column Id dans la requete d'ajout.
     */
    private final int indiceCleGeneree = 1;
    /**
     * Requete pour ajouter une {@link Patisserie}.
     */
    private final String reqAjout = "INSERT INTO patisserie "
            + "(nom, description, prix, calorie) "
            + "VALUES (?,?,?,?)";
    /**
     * Requete pour rechercher une {@link Patisserie}.
     */
    private final String reqRecherche = "SELECT id, nom, description, prix, calorie FROM patisserie "
            + " WHERE nom like ?";
    /**
     * Requete pour supprimer une {@link Patisserie}.
     */
    private final String reqManger = "DELETE FROM patisserie WHERE id = ?";

    @Override
    public Integer ajouter(Patisserie paramPatisserie) {
        Integer retour = null;
        try {
            Connection cnx = UtilConnexionJDBC.getConnection();
            PreparedStatement pstmt =
                    cnx.prepareStatement(reqAjout, Statement.RETURN_GENERATED_KEYS);
            pstmt.setInt(indiceParamCalorieAjout, paramPatisserie.getCalorie());
            pstmt.setString(indiceParamNomAjout, paramPatisserie.getNom());
            pstmt.setString(indiceParamDescriptionAjout, paramPatisserie.getDescription());
            pstmt.setFloat(indiceParamPrixAjout, paramPatisserie.getPrix());
            int nbLigne = pstmt.executeUpdate();
            if (nbLigne == 1) {
                ResultSet rsKey = pstmt.getGeneratedKeys();
                if (rsKey.next()) {
                    retour = rsKey.getInt(indiceCleGeneree);
                }
            }
        } catch (SQLException | NullPointerException e) {
            e.printStackTrace();
        }
        return retour;
    }

    @Override
    public Boolean manger(Patisserie paramPatisserie) {
        Boolean retour = false;
        try {
            Connection cnx = UtilConnexionJDBC.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqManger);
            pstmt.setInt(indiceParamIdManger, paramPatisserie.getId());
            int nbLigne = pstmt.executeUpdate();
            if (nbLigne == 1) {
                retour = true;
            }
        } catch (SQLException | NullPointerException e) {
            e.printStackTrace();
        }
        return retour;
    }

    @Override
    public List<Patisserie> rechercher(String paramNom) {
        List<Patisserie> retour = null;
        try {
            Connection cnx = UtilConnexionJDBC.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqRecherche);
            pstmt.setString(indiceParamNomRecherche, "%" + paramNom + "%");
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                if (retour == null) {
                    retour = new ArrayList<>();
                }
                Patisserie pat = new Patisserie(
                        rs.getInt(indiceColumnId),
                        rs.getString(indiceColumnNom),
                        rs.getString(indiceColumnDescription),
                        rs.getFloat(indiceColumnPrix),
                        rs.getInt(indiceColumnCalorie));
                retour.add(pat);
            }

        } catch (SQLException | NullPointerException e) {
            e.printStackTrace();
        }
        return retour;
    }

}
